package main

import (
	"github.com/gin-gonic/gin"
	"github.com/gin-gonic/gin/binding"
	"net/http"
)

// 绑定数据
type formA struct {
	/**
	json:"foo"和xml:"foo"标签来指定在JSON和XML格式中对应的字段名为foo。
	同时，它还使用了binding:"required"标签，表示此字段是必需的，
	即在请求中必须提供foo字段的值。
	*/
	Foo string `json:"foo" xml:"foo" binding:"required"`
}

type formB struct {
	/**
	使用了json:"bar"和xml:"bar"标签来指定在JSON和XML格式中对应的字段名为bar。
	同样地，它也使用了binding:"required"标签来表示此字段是必需的，
	即在请求中必须提供bar字段的值。
	*/
	Bar string `json:"bar" xml:"bar" binding:"required"`
}

func SomeHandler(c *gin.Context) {
	objA := formA{}
	objB := formB{}
	// c.ShouldBind 使用了 c.Request.Body，不可重用。
	if errA := c.ShouldBindBodyWith(&objA, binding.JSON); errA == nil {
		c.JSON(http.StatusOK, gin.H{
			"msg": `传了一个foo数据`,
		})
	} else if errB := c.ShouldBindBodyWith(&objB, binding.JSON); errB == nil {
		c.JSON(http.StatusOK, gin.H{
			"msg": `传了一个bar数据给我`,
		})
	} else {
		c.JSON(http.StatusOK, gin.H{
			"msg": "不知道你传的啥数据",
		})
	}
}

func main() {
	r := gin.Default()
	//Any自动将所有不同的请求分类
	r.Any("/some", SomeHandler)
	r.Run()
}
